﻿using System;
using System.Data;
using System.Windows.Forms;

namespace AP_GestArm
{
    public partial class frmLocalizacoes : Form
    {
        BaseDados Livres;
        private DataView dv;
        DataGridView Grid = Program.Fo.gridCSV;

        public frmLocalizacoes()
        {
            InitializeComponent();
            GridLocais.DataError += new DataGridViewDataErrorEventHandler(this.GridLocais_DataError);
            cbCamara.SelectedIndexChanged += new EventHandler(this.cbCamara_SelectedIndexChanged);
        }

        #region Filtro Camaras

        private void cbCamara_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbCamara.SelectedIndex == 0) dv.RowFilter = "";
            else dv.RowFilter = "Camara = " + cbCamara.Text;
        }

        #endregion

        private void frmLocalizacoes_Load(object sender, EventArgs e)
        {
            Livres = new BaseDados(Application.StartupPath + "\\Data\\bd.mdb");
            Livres.Locais();

            dv = new DataView(Livres.d7.Tables["Lugares"]);
            GridLocais.DataSource = dv;
            GridLocais.Columns["ID"].Visible = false;
            GridLocais.Columns["Celula"].Visible = false;

            #region Coluna Combox

            this.GridLocais.Columns.Remove("Bitola");
            DataGridViewComboBoxColumn comBox = new DataGridViewComboBoxColumn();
            comBox.HeaderText = "Bitola";

            this.GridLocais.Columns.Insert(5, comBox);//Insere Coluna. Difere do Add porque dá para dizer em que Index                                   
            BindingSource SourceBitolas = new BindingSource(Livres.d7, "Bitolas");
            comBox.DataPropertyName = "Bitola";
            comBox.DataSource = SourceBitolas;
            comBox.DisplayMember = "Código";
            comBox.ValueMember = "Dimensao";

            #endregion

            #region adiciona Items combox Camaras

            this.cbCamara.Items.Clear();
            this.cbCamara.Items.Add("");
            foreach (DataRow oRow in this.Livres.d7.Tables["Lugares"].Rows)
            {
                string Camara = oRow["Camara"].ToString();
                if (!this.cbCamara.Items.Contains(Camara))
                { this.cbCamara.Items.Add(Camara); }
            }

            #endregion

            #region Lista de Celulas na BD de Lugares Livres

            string[] CellArray = new string[] { };
            for (int i = 0; i < Livres.d7.Tables["Lugares"].Rows.Count; i++)
            {
                if (Livres.d7.Tables["Lugares"].Rows[i]["Celula"].ToString() != "")
                {
                    Array.Resize<string>(ref CellArray, i + 1);
                    CellArray[i] = Livres.d7.Tables["Lugares"].Rows[i]["Camara"].ToString() + Livres.d7.Tables["Lugares"].Rows[i]["Celula"].ToString();
                }
            }

            #endregion

            #region Compara Grid Com BD de Lugares e adiciona se não existir

            if (Grid.RowCount > 0)
            {
                foreach (DataRow oRow in Livres.d7.Tables["Lugares"].Rows)
                { oRow["Ocupado"] = "Não"; }//Liberta todos os Lugares

                for (int j = 0; j < Grid.RowCount; j++)
                {
                    if (ArrayContains(CellArray, Grid["Câmara", j].Value.ToString() + Grid["Celula", j].Value.ToString()) == false)
                    {
                        string[] itemsArray = { null ,Grid["Câmara",j].Value.ToString().Trim (), Grid["Zona",j].Value.ToString().Trim (),
                                              Grid["Lugar",j].Value.ToString().Trim (), Grid["Piso",j].Value.ToString().Trim (),
                                              "", "Sim", Grid["Celula",j].Value.ToString().Trim ()};
                        DataRow dRow = Livres.d7.Tables["Lugares"].NewRow();
                        dRow.ItemArray = itemsArray;
                        Livres.d7.Tables["Lugares"].Rows.Add(dRow);
                    }
                }

            #endregion

                #region Lista com gridCSV

                DataGridView GridCsv = Program.Fo.gridCSV;
                string[] CSVArray = new string[] { };
                for (int i = 0; i < GridCsv.RowCount; i++)
                {
                    Array.Resize<string>(ref CSVArray, i + 1);
                    CSVArray[i] = GridCsv["Câmara", i].Value.ToString() + GridCsv["Celula", i].Value.ToString();
                }

                #endregion

                #region Compara GridCSV com Lugares Livres e mete ocupado se existir

                for (int j = 0; j < this.GridLocais.RowCount; j++)
                {
                    if (ArrayContains(CSVArray, GridLocais["Camara", j].Value.ToString() +
                        GridLocais["Celula", j].Value.ToString()) == true)
                        GridLocais["Ocupado", j].Value = "Sim";
                }

                #endregion
            }
        }

        private bool ArrayContains(string[] data, string value)
        {
            for (int i = 0; i < data.Length; i++)
                if (data[i] == value) return true;
            return false;
        }

        #region Grava

        private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            Validate();
            GridLocais.EndEdit();
            Livres.da.Update(Livres.d7, "Lugares");
        }

        #endregion

        private void GridLocais_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            // (No need to write anything in here)
        }

    }
}